﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;

namespace LM.Negocio.Validadores
{
    public class ValidadorDeLocacao : ValidadorAbastrato
    {
        private Locacao _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Locacao> _repositorioDeLocacao;

        public ValidadorDeLocacao( IRepositorioDeConsultaDeObjetos<Locacao> repositorioDeLocacao )
        {
            if ( repositorioDeLocacao == null )
            {
                throw new ArgumentNullException( "repositorioDeLocacao" );
            }

            _repositorioDeLocacao = repositorioDeLocacao;
        }

        /// <summary>
        /// Realiza as verificações necessárias, para identificar irregularidades nos dados.
        /// </summary>
        /// <param name="cliente">Cliente a ser validado.</param>
        public void ValideCadastro(Locacao locacao)
        {
            if ( locacao == null )
            {
                throw new ArgumentException( "locacao" );
            }

            _objetoValidado = locacao;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeClienteNaoInformado();
            ValideCpfNaoInformado();
            ValideDataHoraEntradaNaoInformada();
            ValideVagaNaoInformada();
            ValideTabelaPrecosNaoInformada();
            ValideVeiculoNaoInformado();          
            //ValideClienteNaoCadastrado();
            //ValideVagaNaoCadastrada();
            //ValideTabelaPrecosNaoCadastrada();
           // ValideDependenteNaoCadastrado();
            //ValideVeiculoNaoCadastrado();
            

            base.GarantaSucesso();
        }

        public void ValideAtualizacao( Locacao locacao)
        {
            if ( locacao == null )
            {
                throw new ArgumentException( "locacao" );
            }

            _objetoValidado = locacao;
            base.LimpeInconsistencias();
            
            ValideNomeClienteNaoInformado();
            ValideCpfNaoInformado();
            ValideDataHoraEntradaNaoInformada();
            ValideVagaNaoInformada();
            ValideTabelaPrecosNaoInformada();
            ValideVeiculoNaoInformado();
            //ValideClienteNaoCadastrado();
            //ValideVagaNaoCadastrada();
            //ValideTabelaPrecosNaoCadastrada();
            // ValideDependenteNaoCadastrado();
            //ValideVeiculoNaoCadastrado();

            base.GarantaSucesso();
        }

        public void ValideExclusao( Locacao locacao)
        {
            if ( locacao == null )
            {
                throw new ArgumentException( "locacao" );
            }

            _objetoValidado = locacao;
            base.LimpeInconsistencias();

            ValideLocacaoNaoCadastrada();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if (_objetoValidado.Codigo == 0)
            {
                AdicioneInconsistencia("Código não informado.");
            }
        }

        private void ValideNomeClienteNaoInformado()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.NomeCliente))
            {
                AdicioneInconsistencia("Nome do cliente não informado.");
            }
        }

        private void ValideCpfNaoInformado()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Cpf))
            {
                AdicioneInconsistencia("Cpf não informado.");
            }
        }

        private void ValideDataHoraEntradaNaoInformada()
        {
            if (string.IsNullOrWhiteSpace(_objetoValidado.DataHoraEntrada.ToString().Trim()))
            {
                AdicioneInconsistencia("DataHora entrada não informada.");
            }
        }

        private void ValideVagaNaoInformada()
        {
            if (string.IsNullOrWhiteSpace(_objetoValidado.VagaId.ToString().Trim()))
            {
                AdicioneInconsistencia("Vaga não informada.");
            }
        }

        private void ValideTabelaPrecosNaoInformada()
        {
            if (string.IsNullOrWhiteSpace(_objetoValidado.TabelaPrecoId.ToString().Trim()))
            {
                AdicioneInconsistencia("Tabela de Preço não informada.");
            }
        }

        private void ValideVeiculoNaoInformado()
        {
            if (string.IsNullOrWhiteSpace(_objetoValidado.VeiculoId.ToString().Trim()))
            {
                AdicioneInconsistencia("Veículo não informado.");
            }
        }

        private bool LocacaoJaCadastrada()
        {
            return _repositorioDeLocacao.Consulte(m => m.Codigo == _objetoValidado.Codigo).Any();
        }

        private void ValideLocacaoNaoCadastrada()
        {
            if (!LocacaoJaCadastrada())
                AdicioneInconsistencia("Locacao com o código {0} não cadastrado.", _objetoValidado.Codigo);
        }
    }
}
